#ifndef FAMEDEELECCIONDEFILTROS_H_
#define FAMEDEELECCIONDEFILTROS_H_

#include <gtkmm.h>
#include <iostream>
#include "Util.h"
#include "Columnas.h"

typedef Glib::RefPtr<Gtk::ListStore> refListore;
typedef Gtk::TreeModel::Children type_children;

class FrameDeEleccionDeFiltros:public Gtk::Frame {
private:
	std::map<std::string, std::string> meses;
	std::vector<std::string> valoresFiltrosDimensiones;
	std::vector<std::string> valoresFiltrosHechos;
	std::vector<std::string> valoresInputsDimensiones;
	std::vector<std::string> valoresInputsHechos;

	std::vector<std::string> auxiliarFecha; // por si hay una o mas fechas en la tabla
protected:
	Gtk::Label labelModoEleccion;
	Gtk::HBox cajaHModoSeleccion;
	Gtk::VBox cajaVWidgetsDimensiones;
	Gtk::VBox cajaVWidgetsHechos;
	Gtk::VBox cajaVertical;
	Gtk::HBox cajaHDimensionesHechos;
	Gtk::HBox cajaHElegidos;
	Gtk::HBox cajaHBotonesDimensionesHechosElegidos;
	Gtk::HBox cajaHFecha;

	/// hechos
	Gtk::ScrolledWindow ventanaDeslizableHechos;
	ModeloDeColumnasU columnasHechos;
	Gtk::TreeView visorModeloArbolHechos;
	refListore referenciaModeloHechos;

	//dimensiones
	Gtk::ScrolledWindow ventanaDeslizableDimensiones;
	ModeloDeColumnasU columnasDimensiones;
	Gtk::TreeView visorModeloArbolDimensiones;
	refListore referenciaModeloDimensiones;

	// Inputselegidos
	Gtk::ScrolledWindow ventanaDeslizableInputsElegidos;
	ModeloDeColumnasU columnasInputsElegidos;
	Gtk::TreeView visorModeloArboleInputsElegidos;
	refListore referenciaModeloInputsElegidos;

	// filtros elegidos
	Gtk::ScrolledWindow ventanaDeslizableFiltrosElegidos;
	ModeloDeColumnasU columnasFiltrosElegidos;
	Gtk::TreeView visorModeloArboleFiltrosElegidos;
	refListore referenciaModeloFiltrosElegidos;

	Gtk::ComboBoxText comboDimension;
	Gtk::ComboBoxText comboHecho;
	Gtk::Button botonRemoverFiltro;
	Gtk::Button botonRemoverInput;
	Gtk::Button botonAgregarDimension;
	Gtk::Button botonAgregarHecho;
	Gtk::ToggleButton botonModoEleccion;

	Gtk::Label dia;
	Gtk::Label mes;
	Gtk::Label year;
	Gtk::ComboBoxText comboDia;
	Gtk::ComboBoxText comboYear;
	Gtk::ComboBoxText comboMes;

	void on_cambio_boton_modo();
	void on_boton_agregar_hecho();	// puede ser como filtro o input, depende del modo
	void on_boton_agregar_dimension();
	void on_cambios_dimension();

	// asociado al boton quitar inputs elegidos
	void on_quitar_input();

	void on_quitar_filtro();


public:
	FrameDeEleccionDeFiltros();
	virtual ~FrameDeEleccionDeFiltros();
	// agrega un valor a la ventanaDeslizable de hechos
	void agregarValorAHechos(std::string &dato);
	// agrega un valor a la ventanaDeslizable de dimensiones
	void agregarValorADimensiones(std::string &dato);
	void limpiarCombos();

	std::vector<std::string> &getValoresFiltrosDimensiones();
	std::vector<std::string> &getValoresFiltrosHechos();
	std::vector<std::string> &getValoresInputsDimensiones();
	std::vector<std::string> &getValoresInputsHechos();

	/************************************************/
	/*
	void setCliente(CLiente cliente);

	*/
	/***********************************************/

private:
	void iniciarLabels();
	void inicializarVentanasDeslizables();
	void inicializarBotones();
	void inicializarCombos();
	void inicializarMeses();
	void inicializarHechos();
	void conectarManejadoresDeEvento();
	// agrega un valor a la ventanaDeslizable de Elegidos filtros
	void agregarValorAElegidosFiltros(std::string &dato);
	// agrega un valor a la ventanaDeslizable de Elegidos Inputs
	void agregarValorAElegidosInputs(std::string &dato);

	// si esta el valor, devuelve su posicion (0 o mayor) si no esta devuelve -1
	int hayValorEnVector(std::vector<std::string>& vec, std::string&valor);

	void removerValorDeVentanaDeslizable(refListore &ref, ModeloDeColumnasU& col, std::string&dato);
	void inicializarCajas();
	void limpiarVectoresDatos();
};


#endif /* FAMEDEELECCIONDEFILTROS_H_ */

